const Dayjs = require("dayjs");
const MYSQL = require("../../sql/mysql");
const CONFIG = require("../../config");
const veriftConfig = CONFIG.verift;
const sqlName = "verify_code";
/**
 * 创建一个验证码 
 * @brief 本模块创建手机 or 邮箱验证码会发送真实的手机短信 or 邮件验证码
 * @note 创建验证码以存入MYSQL数据库记录状态表示创建是否成功
 * @param {object} params 配置参数
 * @param {String | number} [params.code] 验证码
 * @param {String | number} params.type 验证码用途类型,模块内没有限制,请注意创建和验证时需要一致
 * @param {String} params.email 验证码指定使用的邮箱
 * @param {String | number} params.user 验证码指定使用的用户id
 * @param {String | Number} params.mobile 验证码指定使用的手机号
 * @param {String} [params.comment] 备注文本
 * @return {Promise<{code:number,msg:string,expired_date:number} | {code:number,msg:string}>} 返回Promise
 */
async function createCode(params = {}) {
  try {
    let dayjs = Dayjs(Date.now());
    // 创建验证码之前将所有过期验证码都置为过期 =========================
    try {
      let querySql = `UPDATE ${sqlName} SET state = 0 WHERE state = 1 and expired_date < ${dayjs.valueOf()}`;
      await MYSQL.promise().query(querySql);
    } catch (error) {
      throw { code: 4041, msg: "数据库操作失败 -1" };
    }
    // 创建验证码 =========================
    let { code, type, email, user, mobile, comment } = params;
    code = code ?? parseInt(Math.random() * 1000000);
    // 验证码有效时长 单位：毫秒
    let code_period = 900000;
    // 验证码创建时间 时间戳（毫秒）
    let created_date = dayjs.valueOf();
    // 验证码过期时间 时间戳（毫秒）
    let expired_date = dayjs.add(code_period, "millisecond").valueOf();
    // 创建验证码数据库结构
    let createCodeData = {
      type,
      code,
      created_date,
      expired_date,
      comment,
      user,
      mobile,
      email,
      state:1,
    };
    try {
      let querySql = `INSERT INTO ${sqlName} SET ?`;
      await MYSQL.promise().query(querySql, createCodeData);
    } catch (error) {
      throw { code: 4041, msg: "数据库操作失败-2" };
    }
    return { code: 0, msg: "创建验证码成功", expired_date };
  } catch (error) {
    console.log("创建验证码模块出现错误");
    console.log(error);
    throw error;
  }
}

/**
 * 创建验证码，并存入到数据库中
 * @param {object} params 参数配置
 * @param {Number} params.type 验证码作用用途
1：支付验证码 （需要查询用户信息   需要查询创建条数）
2：手机验证码找回密码
3：绑定手机
4：验证原手机
5：绑定邮箱
6：解绑邮箱
7：邮箱找回密码
8: 手机验证码登录
9：手机验证码注册
10：邮箱验证码登录
11: 邮箱注册验证码
.
.
.
20: 发送一条验证码短信（测试用）
21：发生一条邮箱邮件（测试用）

 * @param {String} [params.user] 本次验证码仅用的用户id
 * @param {String} [params.email] 本次验证码作用的邮箱
 * @param {Number} [params.mobile] 本次验证码作用的手机号
 * @param {String} params.code 传递自定义验证码,如果传了本参数,验证码将以传入为准
 * @return {Promise} 
 */
module.exports = async (params = {}) => {
  try {
    let { type, user, email, mobile, code } = params;

    if (!type) {
      throw { code: 203, msg: "type参数不能为空" };
    }

    // 手机验证码找回密码 type:2
    if (type == 2) {
      if (!mobile) {
        throw { code: 500, msg: "手机号不能为空" };
      } else if (mobile.length != 11) {
        throw { code: 500, msg: "手机号格式不正确" };
      }
      let userdata;
      try {
        userdata = await userExist({ mobile });
      } catch (error) {
        throw { code: 500, msg: "操作失败,手机号未注册" };
      }
      let { userInfo } = userdata;
      try {
        let createCodeResult = await createCode({
          type,
          mobile,
          comment: "手机验证码找回密码",
        });
        return createCodeResult;
      } catch (error) {
        throw error;
      }
    }

    // 邮箱验证码找回密码 type:7
    if (type == 7) {
      if (!email) {
        throw { code: 500, msg: "邮箱不能为空" };
      }
      let userdata;
      try {
        userdata = await userExist({ email });
      } catch (error) {
        throw { code: 500, msg: "操作失败,邮箱未注册" };
      }
      let { userInfo } = userdata;
      try {
        let createCodeResult = await createCode({
          type,
          email,
          comment: "邮箱验证码找回密码",
        });
        return createCodeResult;
      } catch (error) {
        throw error;
      }
    }

    // 手机验证码登录 type:8
    if (type == 8) {
      if (!mobile) {
        throw { code: 501, msg: "手机号不能为空" };
      } else if (mobile.length != 11) {
        throw { code: 500, msg: "手机号格式不正确" };
      }

      let userdata;
      try {
        userdata = await userExist({ mobile });
      } catch (error) {
        throw { code: 500, msg: "操作失败,手机号未注册" };
      }
      try {
        let createCodeResult = await createCode({
          type,
          mobile,
          comment: "手机验证码登录",
        });
        return createCodeResult;
      } catch (error) {
        throw error;
      }
    }

    // 手机验证码注册 type:9
    if (type == 9) {
      if (!mobile) {
        throw { code: 501, msg: "手机号不能为空" };
      } else if (mobile.length != 11) {
        throw { code: 500, msg: "手机号格式不正确" };
      }
      try {
        let createCodeResult = await createCode({
          type,
          mobile,
          comment: "手机验证码注册",
        });
        return createCodeResult;
      } catch (error) {
        throw error;
      }
    }

    // 邮箱验证码登录 type:10
    if (type == 10) {
      if (!email) {
        throw { code: 501, msg: "邮箱不能为空" };
      }
      try {
        let createCodeResult = await createCode({
          type,
          email,
          comment: "邮箱验证码登录",
        });
        return createCodeResult;
      } catch (error) {
        throw error;
      }
    }

    // 邮箱验证码注册 type:11
    if (type == 11) {
      if (!email) {
        throw { code: 501, msg: "邮箱不能为空" };
      }
      try {
        let createCodeResult = await createCode({
          type,
          email,
          comment: "邮箱验证码注册",
        });
        return createCodeResult;
      } catch (error) {
        throw error;
      }
    }

    // 发送测试手机短信 type:11
    if (type == 20) {
    }
    // 发送测试邮箱邮件 type:21
    if (type == 21) {
    }

    throw {
      code: 500,
      msg: "操作失败,不支持的验证码类型，" + type,
    };
  } catch (error) {
    throw error;
  }
};
